package com.wangsh.webforward.common.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import com.alibaba.fastjson.JSONObject;

/**
 * 调用bat文件工具类
 * 
 * @author wangshMac
 */
public class CallCommandUtil
{
	/* 文件工具类 */
	private FileUtil fileUtil = new FileUtil();
	
	/**
	 * 调用Bat的命令
	 * @param filePath
	 */
	public boolean callBat(File filePath)
	{
		ConstatFinalUtil.SYS_LOGGER.info("==执行命令==开始:{}",filePath);
		Process ps = null;
		try
		{
			String path = filePath.getAbsolutePath() ;
			/*
			 * cmd /c 是执行完命令后关闭命令窗口。
			 * cmd /k 是执行完命令后不关闭命令窗口。
			 * cmd /c start 会打开一个新窗口后执行指令，原窗口会关闭。
			 * cmd /k start 会打开一个新窗口后执行指令，原窗口不会关闭。
			 */
			ps = Runtime.getRuntime().exec("cmd /c start " + path);
			int res = ps.waitFor();
			ConstatFinalUtil.SYS_LOGGER.info("==执行命令==结束:{};执行结果:{}",path,res);
			return true ; 
		} catch (Exception e)
		{
			ConstatFinalUtil.SYS_LOGGER.error("执行命令的时候出错了!",e);
		} finally
		{
			if(ps != null)
			{
				ps.destroy(); // 销毁子进程
				ps = null;
			}
		}
		return false ; 
	}
	
	/**
	 * 切换Ip
	 * @param batName
	 */
	public boolean switchIp(String ip,String country)
	{
		if(country == null)
		{
			country = "" ; 
		}
		/* 判断一个切换国家的简写是否在黑名单中 */
		if(!"".equalsIgnoreCase(country))
		{
			/* 说明已经传入了国家 */
			country = country.toUpperCase() ; 
			/* 搜索的字符串 */
			String countryIndex = country + "," ;
			if(ConstatFinalUtil.CONFIG_JSON.getString("system.proxy.country").indexOf(countryIndex) != -1)
			{
				ConstatFinalUtil.SYS_LOGGER.error("切换ip,被忽略;国家:{},ip:{}",country,ip);
				return false ;
			}
		}
		try {
			
			/*---------根据模板的bat命令,生成bat文件,然后执行--------*/
			String templatePath = "/template/bat/911s5_switch_country_bat.template" ;
			Map<String, String> paramsMap = new HashMap<String, String>();
			/* 911的路径 */
			JSONObject path911JSON = ConstatFinalUtil.SYS_PRO_MAP.get("path.abs911") ;
			if(path911JSON != null)
			{
				/* 获取911的路径 */
				String abs911Path = path911JSON.getString("value") ; 
				paramsMap.put("path_abs911", abs911Path);
				/* 路径分隔符 */
				String pathSplit = ":" ;
				/* 911的路径对象 */
				paramsMap.put("path_root", abs911Path.substring(0, abs911Path.indexOf(pathSplit) + pathSplit.length()));
			}
			/* 国家肯定要么为空字符串,要么有值 */
			paramsMap.put("country", country);
			if(ip != null && !"".equalsIgnoreCase(ip))
			{
				templatePath = "/template/bat/911s5_switch_ip_bat.template"; 
				paramsMap.put("ip", ip);
			}
			/* 文件路径 */
			InputStream sourceInputStream = CallCommandUtil.class.getResourceAsStream(templatePath);
			/* 读取文件内容 */
			String batContent = this.fileUtil.readFile(sourceInputStream, ConstatFinalUtil.CHARSET, paramsMap);
			/* tomcat系统的配置 */
			JSONObject pathTomcatJSON = ConstatFinalUtil.SYS_PRO_MAP.get("path.tomcat") ;
			/* 获取Tomcat的根路径 */
			String pathTomcat = pathTomcatJSON.getString("value") ; 
			/* tomcat临时目录 */
			String relaPath = "/temp/" + UUID.randomUUID().toString() + ".bat" ;
			/* batFile的路径 */
			File batFile = new File(pathTomcat + relaPath);
			/* 如果父目录不存在创建 */
			if(!batFile.getParentFile().exists())
			{
				batFile.getParentFile().mkdirs() ;
			}
			FileOutputStream fos = new FileOutputStream(batFile);
			/* 数据 */
			List<String> dataList = new ArrayList<String>();
			/* bat文件路径 */
			dataList.add(batContent);
			/* 写入bat文件 */
			this.fileUtil.writeFile(fos, dataList);
			
			/* 执行bat命令 */
			this.callBat(batFile);
			try
			{
				/* 线程睡眠2秒钟 */
				Thread.sleep(200);
			} catch (InterruptedException e)
			{
				e.printStackTrace();
			}
			/* 删除文件 */
//			if(batFile.exists())
//			{
//				batFile.delete() ; 
//				ConstatFinalUtil.SYS_LOGGER.info("删除bat,文件路径:{},内容:{}",
//						batFile.getAbsolutePath() ,batContent);
//			}
			return true ; 
		} catch (Exception e) {
			ConstatFinalUtil.SYS_LOGGER.error("执行命令的时候出错了!",e);
		}
		return false ; 
	}
	

	public static void main(String[] args)
	{
		CallCommandUtil commandUtil = new CallCommandUtil();
		/* 调用命令 */
		boolean switchIpFlag = commandUtil.switchIp("", "");
		System.out.println("=switchIp===>" + switchIpFlag);
	}
}
